package com.hongyi.common.framework.domain;

import com.hongyi.common.framework.constant.HttpStatus;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.io.Serializable;

@Data
@NoArgsConstructor
@ApiModel("全局统一返回结果")
public class JsonResult<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 状态码
     */
    @ApiModelProperty(name = "状态码", value = "返回结果的状态码", example = "200")
    private int code;

    /**
     * 返回信息
     */
    @ApiModelProperty(name = "返回信息", value = "返回结果的信息", example = "操作成功")
    private String msg;

    /**
     * 返回数据
     */
    @ApiModelProperty(name = "返回数据", value = "返回结果的数据内容")
    private T data;

    /**
     * 没有数据的成功返回结果
     */
    public static <T>JsonResult<T> ok(){
        return result(HttpStatus.SUCCESS,"操作成功",null );
    }

    /**
     * 有数据的成功返回结果
     * @param data 自定义数据
     */
    public static <T>JsonResult<T> ok(T data){
        return result(HttpStatus.SUCCESS,"操作成功",data );
    }

    /**
     * 自定义信息且没有数据的成功返回结果
     * @param msg 自定义信息
     */
    public static <T>JsonResult<T> ok(String msg){
        return result(HttpStatus.SUCCESS,msg,null );
    }

    /**
     * 自定义信息且有数据的成功返回结果
     * @param msg 自定义信息
     * @param data 自定义数据
     */
    public static <T>JsonResult<T> ok(String msg,T data){
        return result(HttpStatus.SUCCESS,msg,data );
    }

    /**
     * 没有数据的失败返回结果
     */
    public static <T>JsonResult<T> fail(){
        return result(HttpStatus.ERROR,"操作失败",null );
    }

    /**
     * 有数据的失败返回结果
     * @param data 自定义数据
     */
    public static <T>JsonResult<T> fail(T data){
        return result(HttpStatus.ERROR,"操作失败",data );
    }

    /**
     * 自定义信息且没有数据的失败返回结果
     * @param msg 自定义信息
     */
    public static <T>JsonResult<T> fail(String msg){
        return result(HttpStatus.ERROR,msg,null );
    }

    /**
     * 自定义信息且有数据的失败返回结果
     * @param msg 自定义信息
     * @param data 自定义数据
     */
    public static <T>JsonResult<T> fail(String msg,T data){
        return result(HttpStatus.ERROR,msg,data );
    }

    /**
     * 自定义状态码的失败返回结果
     * @param msg 自定义信息
     * @param code 自定义状态码
     */
    public static <T>JsonResult<T> fail(int code,String msg){
        return result(code,msg,null );
    }

    /**
     * 没有数据的失败返回结果
     */
    public static <T>JsonResult<T> warn(){
        return result(HttpStatus.ERROR,"操作失败",null );
    }

    private static <T>JsonResult<T> result (int code, String msg, T data){
        JsonResult<T> jsonResult = new JsonResult<T>();
        jsonResult.setCode(code);
        jsonResult.setMsg(msg);
        jsonResult.setData(data);
        return jsonResult;
    }

}

